package network.server;

import java.io.BufferedReader;
import java.io.BufferedWriter;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.OutputStreamWriter;
import java.net.Socket;
import java.util.Iterator;
import java.util.Vector;

public class ChatThread extends Thread {
	
	private static Vector threads = new Vector();
	private static Vector chatRooms = new Vector();
	
	private Socket sock;
	private BufferedReader reader;
	private BufferedWriter writer;
	
	// 대화명
	String nickName;
	
	public ChatThread(Socket sock) throws IOException {
		this.sock = sock;
		
		writer = new BufferedWriter(
				new OutputStreamWriter(sock.getOutputStream()));
		
		reader = new BufferedReader(
				new InputStreamReader(sock.getInputStream()));
	}
	
	public void send(String message) throws IOException {
		// sock을 통해 메시지를 보내는 일
		writer.write(message + "\n");
		writer.flush();
	}
	
	public String read() throws IOException {
		return reader.readLine();
	}
	
	@Override
	public void run() {
		try {
			// 환영 메시지 보여주기
			send(">>> 어서오세요. <<<");
			while (true) {
				// 메인 메뉴 보여주기
				// 1. 채팅방 목록 조회
				// 2. 채팅방 개설
				// 3. 종료
				send("1. 채팅방 목록 조회");
				send("2. 채팅방 개설");
				send("3. 닉네임 설정");
				send("4. 종료");
				int menu = 0;
				while (true) {
					try {
						send(">>> 메뉴를 선택하세요:");
						menu = Integer.parseInt(read());
					} catch (NumberFormatException e) {
					}
					// 올바른 범위의 메뉴를 선택한 경우에만
					// while문을 빠져나가도록
					if (menu > 0 && menu < 5) {
						break;
					}
				}
				
				// 1번메뉴 (채팅방 목록 조회)
				if (menu == 1) {
					// 채팅방 목록 보여주기
					synchronized (chatRooms) {
						Iterator iter = chatRooms.iterator();
						while (iter.hasNext()) {
							ChatRoom room = (ChatRoom) iter.next();
							send("[" + room.roomNo + "] " + room.title);
						}
					}
					// 채팅방 선택
					send("입장하실 채팅방의 번호를 입력하세요. (상위 메뉴로 이동은 '0')");
					int roomNo = 0;
					while (true) {
						try {
							roomNo = Integer.parseInt(read());
						} catch (NumberFormatException e) {
						}
						if (roomNo == 0) {
							break;
						}
						ChatRoom chatRoom = null;
						// 입장할 방의 번호가 정확히 입력된 경우에만 while문 빠져나가기
						synchronized (chatRooms) {
							Iterator iter = chatRooms.iterator();
							while (iter.hasNext()) {
								ChatRoom room = (ChatRoom) iter.next();
								if (roomNo == room.roomNo) {
									chatRoom = room;
									break;
								}
							}
						}
						if (chatRoom != null) {
							// 채팅방에 현재 클라이언트를 입장시킴
							chatRoom.insertToRoom(this);
							while (true) {
								String messageFromClient = read();
								// "/exit" 입력시 채팅 종료
								if (messageFromClient.equals("/exit")) {
									chatRoom.removeFromRoom(this);
									roomNo = 0;
									break;
								}
								chatRoom.sendToAll(nickName + ": " + messageFromClient);
							}
						}
						if (roomNo == 0) {
							break;
						}
					}
				}
				// 2번메뉴 (채팅방 개설)
				else if (menu == 2) {
					// 제목입력하라는 메시지
					send("개설할 채팅방의 제목을 입력하세요.");
					// 제목 입력 받음
					String title = read();
					ChatRoom room = new ChatRoom();
					room.title = title;
					// 채팅방 목록 (Vector chatRooms)에 추가
					synchronized (chatRooms) {
						chatRooms.add(room);
					}
				}
				// 3번메뉴 (닉네임 설정)
				else if (menu == 3) {
					send("사용할 닉네임을 입력하세요.");
					nickName = read();
					send("닉네임이 '" + nickName + "'으로 설정되었습니다.");
				}
				else if (menu == 0) {
					send("접속을 종료합니다.");
					
					break;
				}
			}
		} catch (IOException e) {
		} finally {
			try {
				if (reader != null) {
					reader.close();
				}
			} catch (IOException e) {}
			try {
				if (writer != null) {
					writer.close();
				}
			} catch (IOException e) {}
			try {
				sock.close();
			} catch (IOException e) {}
			System.out.println(sock.getInetAddress() + " 클라이언트의 연결이 끊겼습니다.");
		}
	}
	
}
